package com.capgemini.cn.authority.rest.service;

import com.capgemini.cn.authority.rest.exception.AuthRestBusinessException;
import com.capgemini.cn.authority.rest.valueobject.DataResponse;
import com.capgemini.cn.authority.rest.valueobject.data.RoleVO;
import org.springframework.data.domain.Sort;

import java.util.List;

/**
 * Created at 2017/9/25
 *
 * @author Andriy
 */
public interface RoleService extends CommonService<RoleVO> {

    /**
     * 分页查询所有数据并按照指定规则排序
     *
     * @param roleName  需要模糊查询的角色名称
     * @param page      查询的页码数，默认为0（即从第一页开始查询）
     * @param size      每页数据的条数，如果值为-1或0则表示查询所有的数据（即最大条数，此时分页参数失效）
     * @param orderProp 排序属性名称
     * @param direction 排序规则
     * @return 包装成{@link DataResponse}对象返回对应的实体对象数据
     */
    DataResponse<List<RoleVO>> findAll(String roleName, int page, int size, String orderProp, Sort.Direction direction);

    /**
     * 根据用户组查询其拥有的角色数据信息
     *
     * @param groupId 用户组主键ID值
     * @return 包装成{@link DataResponse}对象返回对应的实体对象数据
     */
    DataResponse<List<RoleVO>> findGroupInclusiveRole(Long groupId) throws AuthRestBusinessException;

    /**
     * 根据用户组查询其未分配的角色数据信息
     *
     * @param groupId 用户组主键ID值
     * @return 包装成{@link DataResponse}对象返回对应的实体对象数据
     */
    DataResponse<List<RoleVO>> findGroupExclusiveRole(Long groupId) throws AuthRestBusinessException;

    /**
     * 为指定用户组分配角色
     *
     * @param groupId 用户组主键ID值
     * @param roleIds 需要分配的角色
     * @return 包装成{@link DataResponse}对象返回对应的实体对象数据
     */
    DataResponse<List<RoleVO>> assignRole(Long groupId, Long... roleIds) throws AuthRestBusinessException;

    /**
     * 为指定用户组解绑角色
     *
     * @param groupId 用户组主键ID值
     * @param roleIds 需要解绑的角色
     * @return 包装成{@link DataResponse}对象返回对应的实体对象数据
     */
    DataResponse<List<RoleVO>> releaseRole(Long groupId, Long... roleIds) throws AuthRestBusinessException;
}
